POI2013 Inspector
题目大意:
一天公司有n个员工和m个员工记录,每个员工只会在连续的一段时间内工作。当然写观察记录的时候肯定会在工作。记录会给出当时除了他还有多少人在公司。现在给出m条记录分别是谁写的、什么时候写的以及写的时候还有多少人。求第k条记录使得前k条记录可以同时存在不矛盾,且前k+1条记录是矛盾的。输出这个k。
$PS.$ 没有写出来,但似乎并不难。有些乱,但似乎只是乱搞就可以AC?
最后还是去看了题解,在这里orz commoc,他的题解写的很好。
题解:
一个很明显的思路是二分答案,把题目转化成判定性的问题,这样记录就没有先后顺序之分了。
重点是有关出现矛盾的判断:
记录本身的矛盾:两个记录在同一时刻,但人数不同。
这个可以直接特判,比较无脑。
记录的记载而产生约束关系形成了矛盾:比如某人在L时刻、R时刻都记录了东西,但L、R之间存在别人的一个记录,说除他外没有人了,这显然就有问题了。因为刚开始的那个人,在[L,R]之间是必然一直存在的。
这个也比较容易判断:
我们记录每一个人的最晚开始时间与最早结束时间,当成一条线段。对于每一个时间点,我们看看有多少条线段覆盖它。(这是当前时刻最少工作人数)
如果它大于当前时间点的记录人数,显然不可行。
可以构造出方案,但会超过n个人的限制。
这与上一条的区别在于它是可以满足约束条件的,但人数会超。
比如:1时刻有一个人记录有两个人,2时刻记录有1个人,3时刻记录有2个人。当n=3时显然是可以的,但n=2时显然不行。
首先我们想到,人数少是无所谓的,可以认为有些人一直未工作或不在记录的时间点上工作。
所以我们只要算出符合条件的最少人数,看是否小于等于n即可。
那么如何计算呢?
令now表示当前必须在工作的人的数量,total表示当前最少符合的人数。
并令done表示所对应区间已经过去了,还可以留下来工作的人。
令notbegin表示所对应的区间已经过去,但还可以留下来工作的人。
每到达一个新的时刻,我们可以比较一下now+done+notbegin与tot[i] (这个点记录的人数) 的大小。
如果比tot[i] 小,说明人数还不够,我们需要再让一些人提前开始工作。
如果比tot[i] 大,那说明人数多了,我们就让done中的人结束工作,如果还是多,那就让notbegin中的人结束工作。
这时可能会有一个问题:
notbegin的区间还没有开始,怎么可以结束工作呢?这样不相当于矛盾了么?
其实并不是,我们可以认为,我们去掉的是一个没有写过记录的人,他们没有记录,因而没有固定的区间,他们可以随时开始随时结束。(但他们也会被记录到total中)
这样一来,题目即可解决了。
Code:
|
|